맨위로가기

C 셸

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

C 셸(csh)은 C 프로그래밍 언어와 유사한 문법과 대화형 사용에 적합하도록 설계된 유닉스 셸이다. 주요 특징으로는 C 언어 스타일의 문법, 히스토리 기능, 별칭, 디렉터리 스택, 틸다 표기법, 파일명 자동 완성, 작업 제어 등이 있다. C 셸은 스크립트 언어로서 문법적 결함, 기능 부족, 구현 문제로 비판받기도 했지만, 히스토리, 별칭, 틸다 표기법 등 여러 혁신적인 기능을 도입하여 다른 유닉스 셸에 영향을 미쳤다.

더 읽어볼만한 페이지

  • 1978년 소프트웨어 - 워드스타
    세이모어 I. 루빈스타인이 설립한 MicroPro International에서 1979년 출시한 워드스타는 CP/M 운영 체제를 지원하고 우편 병합 및 텍스트 WYSIWYG 기능을 제공한 최초의 마이크로컴퓨터 워드 프로세서 중 하나였으나, 경쟁 제품 등장과 MS-DOS 키보드 활용 미흡으로 쇠퇴하여 현재는 구 폐기 소프트웨어로 분류된다.
  • 1978년 소프트웨어 - TeX
    TeX는 도널드 커누스가 개발한 수학, 과학, 공학 분야의 고품질 문서 출력을 위한 조판 시스템이며, 수학 수식 조판에 특화된 매크로 시스템과 높은 확장성을 제공한다.
  • 유닉스 셸 - 유닉스 계열
    유닉스 계열은 유닉스 운영체제의 특징과 설계를 공유하는 운영체제들을 지칭하며, 유전적, 상표, 기능적 유닉스로 분류되고 macOS는 상표 유닉스이자 유전적 유닉스에 해당하며 리눅스는 기능적 유닉스의 대표적인 예이다.
  • 유닉스 셸 - 본 셸
    본 셸은 스티븐 본이 개발하여 1979년 유닉스에 포함된 셸로, 셸 스크립트, 제어 흐름, 변수, 시그널 처리 등의 기능을 제공하며 여러 셸에 영향을 주었고 현재도 널리 사용된다.
  • 스크립트 언어 - Tcl
    Tcl은 존 오스터하우트가 개발한 명령어 기반의 프로그래밍 언어로, Tk 툴킷과 결합하여 GUI 스크립팅 환경으로 발전했으며, 다양한 운영체제에서 사용 가능하고 C, C++, Java 등 다른 언어와의 인터페이스를 지원한다.
  • 스크립트 언어 - PHP
    PHP는 라스무스 러도프가 개발한 범용 스크립팅 언어로, 웹 개발에 널리 사용되며 LAMP 아키텍처의 핵심 요소이다.
C 셸 - [IT 관련 정보]에 관한 문서
기본 정보
tcsh와 sh가 Mac OS X 데스크탑에서 나란히 실행 중
tcsh와 sh가 Mac OS X 데스크탑에서 나란히 실행 중
개발자빌 조이
최초 릴리스1978년
최신 버전tcsh 6.20.00
최신 버전 출시일2016년 11월 24일
프로그래밍 언어C
운영 체제BSD
유닉스
UNOS
리눅스
macOS
종류유닉스 셸
라이선스BSD 라이선스

2. 설계 목표와 기능

C 셸의 주요 설계 목표는 C 프로그래밍 언어와 유사한 스타일을 가지면서도 대화형 사용에 적합하도록 개선하는 것이었다.[12][1]

C 셸은 사용자가 더 적은 키 입력으로 작업을 수행하고 더 빠르게 실행할 수 있도록 여러 기능을 도입했다. 주요 기능은 다음과 같다:[13][1]


  • 히스토리: 이전 명령어 재실행 기능.
  • 편집 연산자: 명령어 편집 기능.
  • 별칭(alias): 명령어 단축 기능.
  • 디렉터리 스택: 현재 작업 디렉터리 관리 기능.
  • 틸다(~) 표기법: 홈 디렉터리 경로 단축 기능.
  • cdpath: `cd` 명령어 경로 확장 기능.
  • 작업 제어: 다중 작업 관리 기능.
  • 경로 해싱: 실행 파일 검색 속도 향상 기능.


이러한 기능들은 매우 인기가 있었으며, 이후 다른 유닉스 셸에도 많이 복제되었다.[13]

2. 1. C 언어 스타일

유닉스 시스템은 대부분 C 언어로 작성되었기 때문에 C 셸은 시스템과 일관성을 유지하는 명령 언어를 목표로 했다. 키워드, 괄호 사용, 내장 표현식 문법, 배열 지원은 C 언어의 영향을 받았다.[12] C 셸은 본 셸(sh)보다 C 언어와 유사한 표현식 연산자구문을 제공하여 가독성과 속도를 향상시켰다.

다음은 본 셸과 C 셸의 표현식 연산자와 구문을 비교한 예시이다.

본 셸C 셸



본 셸에는 표현식 문법이 없었다. 대괄호로 묶인 조건은 외부 test 프로그램을 실행하는 느린 방식으로 평가해야 했다. 반면, C 셸은 표현식을 직접 평가할 수 있었기 때문에 더 빨랐고 가독성이 좋다고 평가받았다.

다음은 2의 첫 10 제곱을 계산하는 스크립트를 비교한 예시이다.

본 셸C 셸



본 셸은 표현식 문법이 없어 명령 치환과 expr 명령을 사용해야 했지만, C 셸은 자체적인 표현식 문법을 통해 간결하게 표현할 수 있었다.

마지막으로, switch 문의 서로 다른 스타일을 보여주는 예시는 다음과 같다.

본 셸C 셸



본 셸에서는 각 case의 끝을 ";;"로 표시해야 했지만, C 셸에서는 `breaksw`를 사용하여 보다 명확하게 구분했다.

2. 2. 대화형 사용을 위한 개선

C 셸은 사용자가 더 적은 키 입력으로 작업을 수행하고 더 빠르게 실행할 수 있도록 여러 기능을 도입했다. 주요 기능은 다음과 같다:[13][1]

  • 히스토리: 이전 명령어 재실행 기능.
  • 편집 연산자: 명령어 편집 기능.
  • 별칭(alias): 명령어 단축 기능.
  • 디렉터리 스택: 현재 작업 디렉터리 관리 기능.
  • 틸다(~) 표기법: 홈 디렉터리 경로 단축 기능.
  • cdpath: `cd` 명령어 경로 확장 기능.
  • 작업 제어: 다중 작업 관리 기능.
  • 경로 해싱: 실행 파일 검색 속도 향상 기능.


이러한 기능들은 매우 인기가 있었으며, 이후 다른 유닉스 셸에도 많이 복제되었다.[13]

2. 2. 1. 히스토리

빠른 키 입력으로 이전에 입력한 명령행을 불러와 재실행할 수 있다. 예를 들어, 느낌표 두 개(!!)를 입력하면 바로 전에 입력한 명령을 재실행할 수 있다.[13] 또한 "!$"를 입력하면 바로 전 명령행의 마지막 인수로 치환된다.

2. 2. 2. 편집 연산자

이전 명령의 텍스트나 변수 대체에서 간단한 문자열 검색/바꾸기부터 파일 경로 구문 분석을 통한 특정 세그먼트 추출까지 다양한 작업을 수행할 수 있다.[1]

2. 2. 3. 별칭 (Alias)

별칭(에일리어스)은 사용자가 정의한 문자열에 별명을 붙여 명령을 간소화하는 기능이다. 사용자가 별칭 이름을 입력하면 C 셸은 이를 내부적으로 사용자가 정의한 단어 집합으로 확장한다. 많은 경우 별칭은 스크립트보다 빠르게 실행되고 더 편리하다.[1]

예를 들어, "fgrep" 명령의 에일리어스로 "f"를 설정하면 키 입력을 줄여 속도를 높일 수 있으며, 스크립트를 만드는 것보다 간단하다.[1]

2. 2. 4. 디렉터리 스택

디렉터리 스택은 사용자가 push 또는 pop하여 현재 작업 디렉터리를 저장하고 불러올 수 있게 해주며, 파일 시스템의 다른 위치 사이를 더 쉽게 이동할 수 있도록 해준다.[1]

2. 2. 5. 틸다(~) 표기법

틸다(~) 표기법은 "~" 문자를 사용하여 홈 디렉터리를 기준으로 경로 이름을 간략하게 지정하는 방법이다.[1] 이 표기법으로 홈 디렉터리를 "~"로 나타내고, 홈 디렉터리로부터의 상대 경로로 파일을 지정할 수 있다.[1]

2. 2. 6. 파일 이름 완성

Esc 키는 현재 명령 줄 끝에서 파일 이름의 가능한 자동 완성을 대화식으로 표시하는 데 사용할 수 있다.

2. 2. 7. Cdpath

Cdpath는 `cd`(디렉토리 변경) 명령에 대한 검색 경로의 개념을 확장한다. 지정된 디렉토리가 현재 디렉토리에 없는 경우 csh는 cdpath 디렉토리에서 해당 디렉토리를 찾으려고 시도한다. 이는 명령 검색 경로(환경 변수의 PATH) 표기법으로 cd 명령을 확장하는 셸 변수이다. cd 명령으로 지정된 디렉토리가 현재 디렉토리에 없는 경우, cdpath에 지정된 디렉토리 그룹도 조사한다.

2. 2. 8. 작업 제어

1980년대까지 대부분의 사용자는 여러 개의 창을 사용할 수 없는 단순한 문자 모드 터미널을 사용했기 때문에 한 번에 하나의 작업만 할 수 있었다. C 셸의 작업 제어를 통해 사용자는 현재 작업을 일시 중단하고 를 입력하여 C 셸의 새 인스턴스(작업이라고 함)를 생성할 수 있었다. 그런 다음 사용자는 `fg` 명령을 사용하여 작업 간을 전환할 수 있었다. 활성 작업은 전경에 있다고 했다. 다른 작업은 백그라운드에서 일시 중단(중지)되거나 실행 중이라고 했다.[1]

2. 2. 9. 경로 해싱

C 셸은 실행 파일 검색 속도를 높이기 위해 내부 해시 테이블을 참조한다. 이 테이블은 C 셸이 파일을 찾아야 하는 위치(파일이 존재하는 경우)를 알려주며, `rehash` 명령으로 새로 고칠 수 있다.

3. 스크립트 언어로서의 C 셸

C 셸은 한 번에 한 줄씩 작동한다. 각 줄은 공백이나 괄호, 파이핑, 입/출력 리다이렉션 연산자, 세미콜론, 앰퍼샌드 등 특별한 의미를 가진 문자로 구분된 단어들의 집합으로 토큰화된다.[37]

3. 1. 기본 구문

C 셸의 기본 문은 명령 실행이다. 첫 단어는 실행할 명령 이름(내부 또는 외부 명령)이고, 나머지 단어는 인수로 전달된다.

유닉스 시스템은 C 언어로 작성되었기 때문에, C 셸은 시스템의 나머지 부분과 스타일을 일관되게 만드는 것을 목표로 했다. 키워드, 괄호, 표현식 문법, 배열 지원은 모두 C 언어의 영향을 받았다.

C 셸은 sh에 비해 표현식을 직접 평가하여 속도가 빠르고 가독성이 좋다는 평가를 받았다. 표현식 문법과 연산자는 C 언어와 유사하며, 키워드를 뒤집지 않아 전반적인 스타일이 C 언어와 비슷하다.

다음은 본 셸과 C 셸에서 2의 거듭제곱을 계산하는 스크립트 비교이다.

본 셸C 셸



sh 스크립트는 표현식 문법이 없어 `expr` 명령과 명령 치환을 사용한다. C 셸의 `@` 문은 대입문을 의미하는 일종의 표현이다.

기본 구문은 다음과 같다.


  • 와일드카드: 파일 이름 확장에 사용된다.
  • 입출력 리다이렉션: 명령의 입출력을 파일로 대신한다.
  • 연결: 여러 명령을 한 줄에 연결한다.
  • 파이프: 한 명령의 출력을 다음 명령의 입력으로 연결한다.
  • 변수 치환: 변수 값을 사용한다.
  • 인용 부호와 이스케이프: 특수 문자를 일반 문자로 처리한다.
  • 명령 치환: 명령의 출력을 다른 명령의 인수로 사용한다.
  • 백그라운드 실행: 명령을 백그라운드에서 실행한다.
  • 서브 셸: 현재 셸과 분리된 환경에서 명령을 실행한다.

3. 1. 1. 와일드카드

C 셸은 다른 유닉스 셸과 마찬가지로 와일드카드 문자를 사용한 명령줄 인수를 처리하여, 일치하는 파일 이름 목록으로 바꾼다. C 셸에서 사용 가능한 와일드카드는 다음과 같다.

  • `*`: 임의의 개수의 문자와 일치한다.
  • `?`: 임의의 단일 문자와 일치한다.
  • `[`...`]`: 대괄호 안의 문자 중 하나와 일치한다. 하이픈을 사용하여 범위를 지정할 수 있다. (예: `[a-z]`)
  • `[^`...`]`: 대괄호 안의 문자를 제외한 모든 문자와 일치한다.


C 셸은 다른 유닉스 셸에서 가져온 편리한 표기법도 제공한다.

  • `abc{def,ghi}`: `abcdef`와 `abcghi`로 확장된다. (중괄호 확장 참고)
  • `~`: 현재 사용자의 홈 디렉토리를 나타낸다.
  • `~user`: `user`의 홈 디렉토리를 나타낸다.


또한, "*/*.c"와 같이 여러 디렉토리 수준의 와일드카드도 지원된다.[37] 버전 6.17.01부터는 `globstar` 옵션을 통해 zsh 스타일의 재귀 와일드카드(예: "**/*.c")도 사용할 수 있다.

와일드카드 해석을 셸에서 담당하는 것은 유닉스의 중요한 특징 중 하나로, 모든 명령에서 동일한 방식으로 와일드카드를 사용할 수 있게 해준다. 그러나 이 기능은 exec 시스템 호출을 통해 긴 인수 목록을 효율적으로 전달하는 유닉스의 기능에 의존한다. 반면, 윈도우에서는 와일드카드 해석이 각 애플리케이션에서 수행되는 것이 일반적이다.[37]

3. 1. 2. 입출력 리다이렉션

C 셸에서 명령어의 입출력은 기본적으로 C 셸이 실행 중인 콘솔 창을 가리키는 표준 입출력 파일 핸들(stdin, stdout, stderr)을 상속받는다. 하지만 입출력 리다이렉션 연산자를 사용하면, 명령어의 입출력을 파일로 대신할 수 있다.

  • `>` ''파일'' : stdout을 ''파일''에 기록한다. 파일이 이미 존재하면 덮어쓰고, 존재하지 않으면 새로 생성한다. 오류는 여전히 셸 창에 나타난다.
  • `>&` ''파일'' : stdout과 stderr 모두 ''파일''에 기록한다. 파일이 이미 존재하면 덮어쓰고, 존재하지 않으면 새로 생성한다.
  • `>>` ''파일'' : stdout을 ''파일''의 끝에 추가한다.
  • `>>&` ''파일'' : stdout과 stderr 모두 ''파일''의 끝에 추가한다.
  • `<` ''파일'' : stdin을 ''파일''에서 읽는다.
  • `<<` ''문자열'' : 히어 도큐먼트이다. stdin은 ''문자열''과 일치하는 줄이 나올 때까지의 다음 줄들을 읽는다.


stderr만 리다이렉션하는 것은 서브 셸 없이는 불가능하다.[37]

파일 디스크립터를 파일로 지원하는 시스템에서는 다음과 같은 방법을 사용할 수 있다.

```csh

( ( ( echo ok ; '' ) > /dev/fd/0 ) >& /dev/null < /dev/fd/1 ) | ( echo "$<" bye )

3. 1. 3. 연결

C 셸에서는 여러 명령어를 한 줄에 연결하여 사용할 수 있다. `;` 연산자는 첫 번째 명령을 실행한 후, 다음 명령어를 실행한다[37]。 `&&` 연산자는 첫 번째 명령어를 실행하고, 그 명령어가 반환 코드 0으로 성공하면 다음 명령어를 실행한다[37]。 `||` 연산자는 첫 번째 명령어를 실행하고, 반환 코드가 0이 아닌 경우(실패)에만 다음 명령어를 실행한다[37]

3. 1. 4. 파이프

명령어들은 파이프를 사용하여 연결할 수 있으며, 이는 한 명령의 출력이 다음 명령의 입력으로 공급되도록 한다. 두 명령은 모두 동시에 실행된다.[37]

  • `|`는 표준 출력(stdout)을 다음 명령의 표준 입력(stdin)에 연결하며, 오류는 셸 창에 계속 표시된다.
  • `|&`는 표준 출력(stdout)과 표준 오류 출력(stderr)을 모두 다음 명령의 표준 입력(stdin)에 연결한다.[37]


동시에 실행된다는 것은 "병렬"로 실행된다는 것을 의미한다. 멀티 코어 (다중 프로세서) 시스템에서는 파이프된 명령이 실제로 동시에 실행될 수 있으며, 그렇지 않으면 운영 체제의 스케줄러가 명령어들 간에 시간 분할을 수행한다.[37]

예를 들어, "`a | b`"와 같은 명령이 주어지면 셸은 파이프를 생성한 다음 두 명령의 stdio를 리디렉션하여 `a`가 stdout을 파이프의 입력으로 쓰고 `b`가 stdin을 파이프의 출력에서 읽도록 하여 `a`와 `b`를 모두 시작한다. 파이프는 운영 체제에서 일정량의 버퍼링을 사용하여 구현되므로 `a`는 파이프가 채워지기 전에 잠시 동안 쓸 수 있지만 파이프가 채워지면 새로운 쓰기는 `b`가 새로운 쓰기를 차단 해제할 만큼 충분히 읽을 때까지 OS 내에서 차단된다. `b`가 사용 가능한 데이터보다 더 많은 데이터를 읽으려고 하면 `a`가 더 많은 데이터를 쓰거나 파이프가 닫힐 때까지(예: `a`가 종료되는 경우) 차단된다.[37]

3. 1. 5. 변수 치환

단어에 달러 기호 "`$`"가 있는 경우, 그 뒤에 오는 문자열을 변수명으로 해석하고, 해당 변수의 값으로 치환한다.[37] 변수에 경로명을 넣어두면, 히스토리 편집 기구를 사용하여 파일 확장자나 파일명 본체 등 특정 부분을 추출할 수도 있다.[37]

3. 1. 6. 인용 부호와 이스케이프

`\`, `"..."`, `'...'`를 사용하여 공백, 와일드카드, 괄호, 달러 기호와 같은 특수 문자를 리터럴 텍스트로 처리할 수 있다.

  • `\`는 다음 문자를 일반 리터럴 문자로 처리한다.
  • `"..."`는 약한 인용이다. 묶인 공백과 와일드카드는 리터럴로 처리되지만, 변수 및 명령 치환은 여전히 수행된다.
  • `'...'`는 강한 인용이다. 전체 묶인 문자열이 리터럴로 처리된다.


큰따옴표 안에 큰따옴표를 넣으려면 `"\`"`로 이스케이프해야 한다. 변수 확장을 방지하기 위해 달러 기호에도 동일하게 적용된다. `"\$"`. 백틱의 경우 명령 치환 중첩을 방지하려면 작은 따옴표가 필요하다. `"'`'"`

3. 1. 7. 명령 치환

` `...` `를 사용하여 한 명령의 출력을 다른 명령의 인수로 사용할 수 있다.

  • ` `''명령''` `은 ''명령''의 출력을 가져와 단어로 구문 분석하여 명령줄에 다시 붙여넣는 것을 의미한다.


다음은 기울어진 이쑤시개 증후군을 사용한 중첩된 명령 치환의 예시이다.

```csh

echo "`echo "\"\`"echo "\"\\\"\\\`\""echo "\"\\\"\\\\\\\"\\\\\\\`\\\"\""echo "\"\\\"\\\\\\\"\\\\\\\\\\\\\\\"\\\\\\\\\\\\\\\`\\\\\\\"\\\"\""echo "\"\\\"\\\\\\\"\\\\\\\\\\\\\\\"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\`\\\\\\\\\\\\\\\"\\\\\\\"\\\\\\\`\\\\\\\\\\\\\\\"\\\\\\\"\\\\\\\`\\\\\\\"\\\"\\\`\\\"\"\`\""`"

```

명령 치환은 어떤 명령의 출력을 다른 명령의 인수로 사용할 수 있도록 한다.

  • ` `''command''` ` 는 ''command''를 실행하고, 그 출력으로 명령행의 해당 부분을 치환한다.

3. 1. 8. 백그라운드 실행

명령어 뒤에 `&`를 붙이면 해당 명령어를 백그라운드에서 실행하고, 즉시 다음 명령어를 입력할 수 있는 프롬프트를 표시한다.[37] C 셸은 일반적으로 명령어 실행이 끝날 때까지 기다린 후 다음 명령어를 입력받거나 프롬프트를 표시한다.

3. 1. 9. 서브 셸

서브 셸은 현재 셸의 자식 프로세스이며, 현재 상태를 상속받지만 이를 변경해도 부모 셸에는 영향을 주지 않는다. 예를 들어, 서브 셸에서 현재 디렉터리를 변경해도 부모 셸의 현재 디렉터리는 변하지 않는다.

  • `( 명령어 )`는 `명령어`를 서브 셸에서 실행한다.[37]

3. 2. 제어 구조

C 셸은 조건 검사와 반복을 위한 제어 구조를 제공한다. 조건 검사 제어 구조로는 `if` 문과 `switch` 문이 있고, 반복 제어 구조로는 `while`, `foreach`, `repeat` 문이 있다.

3. 2. 1. if 문

C 셸에서 `if` 문에는 두 가지 형식이 있다.

짧은 형식은 한 줄로 표현되며, 조건식이 참일 경우 하나의 명령만 실행할 수 있다.

```csh

if (식) 명령

```

긴 형식은 `then`, `else`, `endif` 키워드를 사용하여 여러 명령 블록을 중첩할 수 있다.

```csh

if (식1) then

명령들

else if (식2) then

명령들

...

else

명령들

endif

```

`else`와 `if`가 같은 줄에 나타나면 csh는 이를 중첩이 아닌 연결로 처리한다. 즉, `endif`는 한 번만 사용한다.

C 셸은 조건 분기와 반복이라는 제어 구조를 제공한다. 조건 분기에는 `if` 문과 `switch` 문이 있고, 반복문에는 `while` 문, `foreach` 문, `repeat` 문이 있다.

긴 형식의 `if`문 예시는 다음과 같다.

```csh

if (식1) then

명령11

명령12

명령13

...

else if (식2) then

명령21

명령22

명령23

...

else

명령n1

명령n2

명령n3

...

endif

3. 2. 2. switch 문

`switch` 문은 문자열을 와일드카드 문자를 포함할 수 있는 패턴 목록과 비교한다. 일치하는 항목이 없으면, 기본 동작을 수행한다.

```csh

switch ( 문자열 )

case 패턴1:

명령

breaksw

case 패턴2:

명령

breaksw

...

default:

명령

breaksw

endsw

```

C 셸에서 `switch` 문은 문자열을 패턴 목록과 비교하며, 패턴에는 와일드카드 문자를 포함할 수 있다. 어떤 패턴과도 일치하지 않으면 `default`에 지정된 명령을 실행하고, 일치하는 경우에는 해당 패턴에 지정된 명령을 실행한다.

```csh

switch (문자열)

case 패턴1:

명령어 열11

명령어 열12

명령어 열13

:

breaksw

case 패턴2:

명령어 열21

명령어 열22

명령어 열23

:

breaksw

:

default:

명령어 열n1

명령어 열n2

명령어 열n3

:

endsw

```

다음은 본 셸과의 비교 예시이다.

본 셸C 셸


3. 2. 3. while 문

while 문은 표현식이 참인 동안 명령을 반복 실행하는 제어 구조이다.

```csh

while ( 표현식 )

명령

end

```

C 셸은 조건 분기와 반복을 위한 제어 구조를 제공한다. 조건 분기에는 `if` 문과 `switch` 문이 있고, 반복문에는 `while` 문, `foreach` 문, `repeat` 문이 있다. `while` 문은 먼저 식을 평가하고, 결과가 참이면 지정된 명령어들을 실행한 후 다시 식을 평가하는 과정을 반복한다.

다음은 2의 10제곱을 구하는 예제이다.

본 셸C 셸


3. 2. 4. foreach 문

C 셸에서 `foreach` 문은 값 목록(일반적으로 와일드카드로 생성된 파일 이름 목록)을 받아, 각 값에 대해 루프 변수를 설정하고 지정된 명령어들을 실행한다.



foreach 루프변수 (값1 값2 값3 ... 값n)

명령어1

명령어2

명령어3

...

end



C 셸은 조건 분기와 반복이라는 제어 구조를 제공한다. 조건 분기에는 `if` 문과 `switch` 문이 있고, 반복문에는 `while` 문, `foreach` 문, `repeat` 문이 있다.

3. 2. 5. repeat 문

C 셸은 조건 분기와 반복이라는 제어 구조를 제공한다. 반복문으로는 `while` 문, `foreach` 문, `repeat` 문이 있다. `repeat` 문은 지정된 정수값만큼 명령어를 반복 실행한다.

```csh

repeat 정수값 명령어

3. 3. 변수

C 셸은 셸 변수와 환경 변수를 모두 지원한다.[14] `set` 또는 `@` 명령문을 사용하여 셸 변수를 생성하며, C 셸 내부에 존재한다. 이러한 변수는 자식 프로세스로 전달되지 않는다. 셸 변수는 단순 문자열이거나 문자열 배열일 수 있다.

`setenv` 명령문을 사용하여 생성된 환경 변수는 항상 단순 문자열이며, 모든 자식 프로세스로 전달된다.

일부 셸 변수는 미리 정의되어 있으며 와일드카드가 아무것도 일치하지 않을 경우 어떻게 해야 하는지 등과 같은 다양한 내부 C 셸 옵션을 제어하는 데 사용된다.

현재 버전의 csh에서는 문자열의 길이가 수백만 자까지 임의로 길어질 수 있다.

필요에 따라 변수를 확장할 수 있다. 그러나 고정된 크기로 작업하는 것이 바람직한 경우, 다음 구문을 사용하는 것이 좋다.

```csh

# 1024개의 요소를 저장할 수 있을 만큼 큰 변수를 생성합니다.

set fixed = {,}{,}{,}{,}{,}{,}{,}{,}{,}{,}

3. 4. 표현식

C 셸은 C에서 차용한 연산자를 사용하여 32비트 정수 표현식을 구현하며, 문자열 비교 및 파일 시스템 테스트(예: 파일 존재 여부 테스트)를 위한 몇 가지 추가 연산자를 포함한다.[37] 연산자는 피연산자와 공백으로 구분해야 한다. 변수는 `$`''이름''으로 참조된다.

연산자 우선 순위 또한 C에서 차용되었지만, 동일한 우선 순위의 연산자 시퀀스에서 무엇이 먼저 오는지에 대한 모호성을 해결하기 위해 다른 연산자 결합성 규칙을 사용한다. C에서 대부분의 연산자에 대한 결합성은 왼쪽에서 오른쪽으로 진행되지만, C 셸에서는 오른쪽에서 왼쪽으로 진행된다. 예를 들어:

CC 셸



C 셸 예제에서 괄호는 비트 시프트 연산자가 I/O 리디렉션 연산자로 혼동되는 것을 방지하기 위한 것이다. 두 언어 모두에서 괄호는 명확성을 위해서라도 원하는 평가 순서를 명시적으로 지정하는 데 항상 사용할 수 있다.

4. 비판

C 셸은 스크립트 언어로서 여러 가지 비판을 받았다. 스티븐 본은 csh가 대화형 사용에는 자신의 셸보다 우수하다고 인정했지만,[15] 스크립팅에서는 인기가 없다고 밝혔다.

1990년대 중반까지 C 셸은 널리 사용되었지만, POSIX 위원회는 대화형 및 스크립팅 목적으로 KornShell만 사용해야 한다고 명시하며 C 셸 사용에 대해 비판했다.[17] C 셸은 구문 결함, 기능 부족, 구현 문제 등으로 비판받았다.[18][19]

주요 비판 내용은 다음과 같다.


  • 구문 결함: 언어 정의에 불필요한 불일치가 있었다. 예를 들어, `set`, `setenv`, `alias` 명령어는 비슷한 작업을 하지만 사용법에 차이가 있었다.
  • 기능 부족: stdio 파일 핸들을 독립적으로 조작하거나 함수를 지원하는 기능이 부족했다.
  • 구현 문제: 임시 파서를 사용했기 때문에 처리할 수 있는 명령의 복잡성에 제한이 있었다. 이 때문에 복잡한 스크립트를 작성할 때 오류가 발생하거나 원치 않는 결과가 나올 수 있었다. 또한 "0: Event not found."와 같이 문제에 대한 유용한 정보를 제공하지 않는 오류 메시지도 비판받았다.


이러한 문제점에도 불구하고 C 셸은 여러 혁신적인 기능 덕분에 대화형 사용에서는 인기를 얻었지만, 스크립트 언어로서의 한계는 분명했다.

4. 1. 문법적 결함

`set`, `setenv`, `alias` 명령어는 기본적으로 같은 기능을 수행하지만, 불필요한 차이점을 보인다. `set`은 등호(=)를 사용해야 하지만, `setenv`와 `alias`는 사용하지 않는다. `set`은 단어 나열을 괄호로 묶어야 하지만, `setenv`와 `alias`는 그렇지 않다[38]

제어 구조의 종료 키워드도 일관성이 없다. `if`는 `endif`로, `switch`는 `endsw`로 끝나지만, 루프 관련 구문은 `end`로 끝난다[38]

이러한 문법적 결함은 C 셸의 사용성을 저해하고, 스크립트 작성 시 오류를 유발할 가능성을 높인다.

4. 2. 기능 부족

C 셸은 표준 입출력 파일 핸들 조작 기능과 함수 지원이 부족하다는 비판을 받는다.[39][40] 표준 입력 파일 핸들을 조작하는 기능이 없고, 함수를 지원하지 않는다. C 셸에서 함수와 비슷한 기능은 별칭(alias)뿐인데, 한 줄의 코드만 정의할 수 있으며, 제어 구문의 대부분은 중간에 줄 바꿈을 필요로 한다.

본 셸(Bourne shell)은 지역 변수를 사용할 수는 없지만 함수를 정의할 수 있다. 그러나 C 셸은 함수와 비슷한 기능이 제한적이다. 이러한 제약 때문에 C 언어 프로그램의 기능을 그대로 C 셸로 구현하기는 어렵다. 결과적으로 큰 프로젝트일수록 C 언어나 본 셸 스크립트를 사용하는 경향이 있다.

4. 3. 구현 문제

C 셸의 구문 분석은 즉흥적이어서 많은 비판을 받았다. 1970년대 초에는 컴파일러 기술이 어느 정도 성숙해 있었고[41], 많은 언어는 하향식 또는 상향식 구문 분석기를 사용하여 완전 재귀적인 문법을 인식하도록 구현되었다. C 셸에서 즉흥적인 설계가 된 이유는 불분명하다. 조이는 2009년 인터뷰에서 "Unix에 관해 작업을 시작했을 때, 나는 유능한 프로그래머가 아니었다"라고 말하며, 단순히 그것이 답일지도 모른다[42]。 그러나, 즉흥적인 설계를 선택한 탓에 C 셸은 완전 재귀적이 아니게 되었다. 따라서, 실현할 수 있는 처리의 복잡성에는 한계가 있다.

대화형으로 명령을 입력하고 실행하는 데에는 편리하지만, 복잡한 명령을 실행하려 스크립트를 작성하면 시간이 오래 걸리고, 게다가 자주 실패하며, 암호와 같은 오류 메시지를 표시하거나, 바람직하지 않은 결과를 초래한다. 예를 들어, C 셸에서는 제어 구조 사이의 파이프가 불가능하다. `foreach`의 출력을 파이프로 `grep` 명령에 보내려고 해도 단순히 작동하지 않는다. 해결책으로는, `foreach`를 사용한 부분을 별도의 스크립트로 만들어 구문 분석 문제를 회피하는 방법이 있다. 이렇게 하면, 해당 스크립트는 다른 C 셸의 프로세스로 동작하므로 파이프로 연결하는 것도 자유롭다.

다음은 바람직하지 않은 동작의 예시이다.

의도작동하는 스크립트오작동하는 스크립트
myfile이 존재하지 않으면, mytext를 그곳에 쓰는 형태로 생성



오른쪽 스크립트에서는 항상 빈 파일이 생성된다. C 셸의 평가 순서가 명령줄 단위이고, 먼저 입출력 리디렉션을 평가하도록 되어 있기 때문이며, myfile이 그 시점에서 만들어져 버리고, 파일의 존재를 확인했을 때는 이미 존재하기 때문이다.

또한, 오류 메시지가 빈약하다는 점도 자주 비판받고 있다. 예를 들어 "0 event not found"라는 메시지로는 무엇이 문제인지조차 알 수 없다.

5. 영향

C 셸은 히스토리, 별칭(에일리어스), 틸다(~) 표기법 등 여러 혁신적인 기능을 도입하여 다른 유닉스 셸에 많은 영향을 주었다. 히스토리는 이전에 입력한 명령어를 불러와 재실행할 수 있게 해주는 기능이고, 별칭은 사용자가 정의한 문자열을 특정 명령어에 연결하여 더 빠르게 명령을 실행할 수 있게 해주는 기능이다. 틸다 표기법은 홈 디렉토리를 "~" 기호로 간단하게 표현할 수 있게 해준다.

tcsh는 C 셸을 기반으로 기능을 추가한 셸이다. 앨런 홀럽의 SH, 해밀턴 C 셸 등 C 셸의 기능을 모방한 클론들도 개발되었다.

하지만 C 셸은 스크립팅에서는 비판을 받기도 했다. `set`, `setenv`, `alias` 명령어는 비슷한 작업을 수행하지만, 사용법에 일관성이 없는 경우가 있었다. 또한 파일 핸들을 조작하거나 함수를 지원하는 기능이 부족하다는 지적도 있었다. 이러한 문제점에도 불구하고, C 셸의 여러 기능들은 다른 유닉스 셸에 채택되어 널리 사용되고 있다.

참조

[1] 간행물 tcsh-6.20.00 is now available! http://mx.gw.com/pip[...] 2016-11-24
[2] 웹사이트 Harley Hahn's Guide to Unix and Linux http://unix.harley.c[...]
[3] 웹사이트 Berkeley Engineering Lab Notes, Volume 1, Issue 2, October 2001 http://coe.berkeley.[...]
[4] 서적 "An Introduction to the C shell" http://www.kitebird.[...]
[5] 웹사이트 Ubuntu - Details of package csh http://packages.ubun[...]
[6] 웹사이트 Debian - Details of package csh http://packages.debi[...]
[7] 웹사이트 Ubuntu - Details of package tcsh http://packages.ubun[...]
[8] 웹사이트 Debian - Details of package tcsh http://packages.debi[...]
[9] 뉴스그룹 C shell with command and filename recognition/completion https://groups.googl[...] 2010-12-29
[10] 웹사이트 tcsh(1) man page https://web.archive.[...]
[11] 문서 Fixes file in tcsh-17 June 2000
[12] USENET Re: Late Bloomers Revisited https://groups.googl[...] 1989-12-17
[13] 문서 Pronounced "bang, bang"
[14] 서적 UNIX Systems Benjamin/Cumming Publishing Company 1990
[15] 뉴스 The Unix Shell https://archive.org/[...] 2015-01-30
[16] 서적 The Insider's Guide To The Universe https://www.1000bit.[...] Charles River Data Systems, Inc.
[17] 문서 IEEE Standard for Information Technology, Portable Operating System Interface (POSIX), Part 2: Shell and Utilities, Volume 2 IEEE 1992
[18] 웹사이트 Csh Programming Considered Harmful http://www.faqs.org/[...]
[19] 웹사이트 Top Ten Reasons not to use the C shell http://www.grymoire.[...]
[20] 서적 Compiler Construction for Digital Computers John Wiley & Sons 1971
[21] 웹사이트 Bill Joy in Conversation with Brent Schlender, Churchill Club, Santa Clara, CA, 11 Feb 2009 https://web.archive.[...]
[22] 서적 On Command: Writing a Unix-Like Shell for MS-DOS M&T Books, Redwood City, CA 1986-1987
[23] 간행물 Hamilton C shell Announcement http://hamiltonlabs.[...] 2020-07-11
[24] 웹사이트 Hamilton C shell for Windows Release Notes 5.2.g http://hamiltonlabs.[...] Hamilton Laboratories, Redmond, WA 2018-04-03
[25] 서적 Hamilton C shell Quick Reference http://hamiltonlabs.[...] Hamilton Laboratories, Wayland, MA 2020-07-11
[26] 간행물 tcsh-6.18 is now available http://mx.gw.com/pip[...] 2012-01-16
[27] 웹사이트 Harley Hahn's Guide to Unix and Linux http://unix.harley.c[...]
[28] 웹사이트 Berkeley Engineering Lab Notes, Volume 1, Issue 2, October 2001 http://coe.berkeley.[...]
[29] 서적 "An Introduction to the C shell" http://www.kitebird.[...]
[30] URL https://packages.deb[...]
[31] URL https://packages.ubu[...]
[32] URL https://packages.deb[...]
[33] URL https://packages.ubu[...]
[34] 뉴스그룹 C shell with command and filename recognition/completion https://groups.googl[...] 2010-12-29
[35] 웹사이트 tcsh(1) man page http://www.tcsh.org/[...]
[36] 문서 Fixes file in tcsh-6.17.00.
[37] USENET Re: Late Bloomers Revisited https://groups.googl[...] USENET post to comp.lang.misc by Piercarlo "Peter" Grandi, Dept of CS, UCW Aberystwyth, UK 1989-12-17
[38] 간행물 IEEE Standard for Information Technology, Portable Operating System Interface (POSIX), Part 2: Shell and Utilities, Volume 2 IEEE 1992
[39] 웹사이트 Csh Programming Considered Harmful http://www.faqs.org/[...] Tom Christiansen
[40] 웹사이트 Top Ten Reasons not to use the C shell http://www.grymoire.[...] Bruce Barnett
[41] 서적 Compiler Construction for Digital Computers John Wiley & Sons 1971
[42] 웹사이트 Bill Joy in Conversation with Brent Schlender, Churchill Club, Santa Clara, CA, Feb 11, 2009 http://fora.tv/2009/[...]
[43] 서적 On Command: Writing a Unix-Like Shell for MS-DOS M&T Books, Redwood City, CA 1986
[44] 논문 Hamilton C shell Announcement http://hamiltonlabs.[...] 2010-11-22
[45] 웹사이트 Hamilton C shell for Windows Release Notes 4.0 http://hamiltonlabs.[...] 2010-06-19
[46] 웹사이트 Hamilton C Shell 2009 – The Missing Shell for Windows http://www.4gigs.com[...] 2009-09-19
[47] 서적 Hamilton C shell Quick Reference http://hamiltonlabs.[...] Hamilton Laboratories, Wayland, MA 1988
[48] 웹사이트 htk http://htk.eng.cam.a[...]
[49] 웹인용 tcsh-6.18 is now available http://mx.gw.com/pip[...] 2012-01-14



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com